<?php
declare (strict_types=1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Db;

// 导入数据
class Hqwx extends Command
{
    protected function configure()
    {
        $this->setName('hqwx')
            ->setDescription('合并视频任务')
            ->addOption('folder', 'f', \think\console\input\Option::VALUE_REQUIRED, '视频文件夹路径');
    }

    protected function execute(Input $input, Output $output)
    {
        // 设置内存上限（根据实际需要决定是否保留）
        ini_set('memory_limit', '1024M');

        // 从命令行参数获取 folder
        $folder = $input->getOption('folder');

        // 检查 folder 参数是否存在
        if (!$folder) {
            $output->writeln("错误：请提供 folder 参数");
            $output->writeln("使用方法：php think hqwx --folder=\"视频文件夹路径\"");
            return;
        }

        // 检查文件夹是否存在
        if (!is_dir($folder)) {
            $output->writeln("错误：指定的文件夹不存在 - " . $folder);
            return;
        }

        // 获取目录结构信息
        $folder_info = \util\File::get_dirs($folder);
        // 若子目录数等于文件数，认为已完成转换
        if (!empty($folder_info['file']) && count($folder_info['dir']) - 2 == count($folder_info['file'])) {
            $output->writeln("当前文件夹已处理完成！");
            return;
        }

        $dir_list = $folder_info['dir'];

        foreach ($dir_list as $dir) {
            // 忽略当前及上级目录符号
            if ($dir === '.' || $dir === '..') {
                continue;
            }

            // 构造 m3u8 文件路径
            $m3u8_path = $folder . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . 'index.m3u8';

            // 替换标题并生成目标 mp4 路径
            $title = str_replace('.m3u8', '', $dir);
            $mp4_path = $folder . DIRECTORY_SEPARATOR . $title . '.mp4';

            // 若已存在则跳过
            if (file_exists($mp4_path)) {
                continue;
            }

            // 安全地构造命令行参数
            $safe_m3u8_path = escapeshellarg($m3u8_path);
            $safe_mp4_path = escapeshellarg($mp4_path);

            $command = "ffmpeg -allowed_extensions ALL -i {$safe_m3u8_path} -c copy {$safe_mp4_path}";

            // 使用独立变量接收 exec 输出，避免污染原 output 对象
            $execOutput = [];
            $returnVar = 0;

            exec($command, $execOutput, $returnVar);

            if ($returnVar === 0) {
                $output->writeln("成功将 $m3u8_path 合并为 $mp4_path");
            } else {
                $errorMsg = implode("\n", $execOutput);
                $output->writeln("合并 $m3u8_path 失败，错误信息: " . $errorMsg);
            }
        }
    }

}
